IF EXISTS (SELECT * FROM SYSOBJECTS WHERE name='spSeguridadRolMenu' and XTYPE='P')
BEGIN
	DROP PROCEDURE [dbo].[spSeguridadRolMenu]
END
GO
CREATE PROCEDURE [dbo].[spSeguridadRolMenu]
	 @OP VARCHAR(64)=NULL
	,@ParamAuxiliar NVARCHAR(MAX)=NULL
	,@ID INT=NULL
	,@FechaGrab DATETIME=NULL
	,@UsuarioGrab VARCHAR(32)=NULL
	,@CodMenu VARCHAR(128)=NULL
	,@CodRol VARCHAR(16)=NULL
WITH ENCRYPTION
AS
SET NOCOUNT ON;
BEGIN TRY

/**** VERIFICAR SI LA SESSION DE USUARIO ESTA ACTIVA ****/
-----EXEC SP_ExecuteSQL N'dbo.spSeguridadUsuario @OP=''VerificarSessionActiva'''
/**** FIN - VERIFICAR SI LA SESSION DE USUARIO ESTA ACTIVA ****/--DECLARE @ERROR VARCHAR(500)

DECLARE @RolAdministradores VARCHAR(16)=dbo.fnGetValorParametro('RolAdministradores')
DECLARE @AUX VARCHAR(2048)
DECLARE @indice	INTEGER		-- Esta variable es necesaria para mapear el XML


/*****     OPERACION POR DEFECTO    *****/
IF @OP IS NULL OR @OP = ''
BEGIN
	SELECT
		t.*
	FROM
		[dbo].[SeguridadRolMenu] t
	RETURN 0
END

/*****     SELECCIONAR LAS OPCIONES DEL MENU ASOCIADAS A UN ROL DETERMINADO    *****/
IF @OP = 'SelectMenuRol'
BEGIN
	SELECT
		t.*
	FROM
		[dbo].[SeguridadRolMenu] t
		--LEFT JOIN [dbo].[SeguridadMenu] m ON t.CodMenu=m.Codigo --and m.CodRol=ISNULL(@AUX,'')	
	WHERE
		t.CodRol=@CodRol
		
	RETURN 0
END

/*****     Actualizar el estado de las opciones del menu para un rol determinado  *****/
IF @OP = 'ActualizarMenuRol'
BEGIN
	BEGIN TRANSACTION
	
	-- Elimino los registros grabados en la tabla [SeguridadRolMenu] para el Rol Indicado
	DELETE FROM [SeguridadRolMenu] WHERE CodRol=@CodRol
	
	----------------------------------------------------------------------------------------------
	-- Inserto los datos recibidos en el parametro @ParametroAuxiliar
	----------------------------------------------------------------------------------------------
	
	--- Preparo el XML
	EXEC sp_xml_preparedocument @indice OUTPUT, @ParamAuxiliar
	--- Inserto la informacion que esta en el XML en la tabla [SeguridadRolMenu]
	insert into [SeguridadRolMenu]
		(UsuarioGrab,CodRol,CodMenu)
	SELECT
		dbo.fnGetUsuarioSession(),@CodRol,[CodMenu]
	FROM 
		OPENXML(@indice,'/DocumentElement/XML_TABLE',2)WITH (
				 [CodMenu] varchar(128)
			)
	--- Libero los recursos de la memoria
	EXEC sp_xml_removedocument @indice
	
	
	--- Si el rol es el administrador, debo verificar que no se esten deshabilitando las opciones del menu "MANTENIMIENTO"
	IF @CodRol=@RolAdministradores
	BEGIN
		--- Menu: Mantenimiento
		IF NOT EXISTS (SELECT * FROM [SeguridadRolMenu] WHERE CodRol=@RolAdministradores AND CodMenu='Cod_10')
		BEGIN
			SELECT @ParamAuxiliar='No puede deshabilitar la opcion "'+m.etiqueta+'" para los usuarios que pertenecen al Rol "'+UPPER(@RolAdministradores)+'", Revise!.'
				FROM [SeguridadMenu] m
					WHERE m.Codigo='Cod_10'
			RAISERROR(@ParamAuxiliar,16,1)
			RETURN 1
		END
		--- Menu: Seguridad
		IF NOT EXISTS (SELECT * FROM [SeguridadRolMenu] WHERE CodRol=@RolAdministradores AND CodMenu='Cod_10_40')
		BEGIN
			SELECT @ParamAuxiliar='No puede deshabilitar la opcion "'+m.etiqueta+'" para los usuarios que pertenecen al Rol "'+UPPER(@RolAdministradores)+'", Revise!.'
				FROM [SeguridadMenu] m
					WHERE m.Codigo='Cod_10_40'
			RAISERROR(@ParamAuxiliar,16,1)
			RETURN 1
		END
		--- Menu: Asignar Menu a Roles de Usuario
		IF NOT EXISTS (SELECT * FROM [SeguridadRolMenu] WHERE CodRol=@RolAdministradores AND CodMenu='Cod_10_40_50')
		BEGIN
			SELECT @ParamAuxiliar='No puede deshabilitar la opcion "'+m.etiqueta+'" para los usuarios que pertenecen al Rol "'+UPPER(@RolAdministradores)+'", Revise!.'
				FROM [SeguridadMenu] m
					WHERE m.Codigo='Cod_10_40_50'
			RAISERROR(@ParamAuxiliar,16,1)
			RETURN 1
		END
	END
	
	
	COMMIT TRANSACTION		
	RETURN 0
END

--- Si se llega a este punto es porque el @OP indicado no Existe en el Procedimiento Almacenado
IF @OP IS NOT NULL
BEGIN
	SET @ParamAuxiliar='La Operacion "'+@OP+'" No esta definida en el Procedimiento almacenado "'+OBJECT_NAME(@@PROCID)+'", Revise!.'
	RAISERROR(@ParamAuxiliar,16,1)
	RETURN 1
END

--- CONTROLAR Y REGISTRAR LOS ERRORES
END TRY
BEGIN CATCH
	--- Recopilo la informacion del error
	DECLARE @ERROR_NUMBER INT=ERROR_NUMBER(),@ERROR_SEVERITY INT=ERROR_SEVERITY(),@ERROR_STATE INT=ERROR_STATE(),@ERROR_PROCEDURE VARCHAR(128)=ERROR_PROCEDURE(),@ERROR_LINE INT=ERROR_LINE(),@ERROR_MESSAGE VARCHAR(2048)=ERROR_MESSAGE()
	--- Si hay transacciones abiertas, hago un rollback, SE ENCIERRA EN UN (TRY-CATCH) PARA QUE NO SE MUESTRE EL ERROR: Transaction count after EXECUTE indicates a mismatching number of BEGIN and COMMIT
	IF(@@TRANCOUNT>0) BEGIN BEGIN TRY ROLLBACK TRANSACTION END TRY BEGIN CATCH END CATCH END
	--- Ejecuto el SP que controla y registra el error
	EXEC [spSeguridadMessageException] @OP='MostrarMensaje',@ERROR_NUMBER=@ERROR_NUMBER,@ERROR_SEVERITY=@ERROR_SEVERITY,@ERROR_STATE=@ERROR_STATE,@ERROR_PROCEDURE=@ERROR_PROCEDURE,@ERROR_LINE=@ERROR_LINE,@ERROR_MESSAGE=@ERROR_MESSAGE
	RETURN 1
END CATCH;
